/*
 *
 * 名称：八字
 * 功能：包括八字、干支柱等逻辑等逻辑
 * 作者：清河张
 * 时间：2025.05.12
 *
 */

#include "bazi.h"
#include <cstdio>
#include <cstring>
#include <cstdlib>

/*
 *
    甲	乙	丙	丁	戊	己	庚	辛	壬	癸|
==================================================
    子	丑	寅	卯	辰	巳	午	未	申	酉|	戌	亥

    戌	亥	子	丑	寅	卯	辰	巳	午	未|	申	酉

    申	酉	戌	亥	子	丑	寅	卯	辰	巳|	午	未

    午	未	申	酉	戌	亥	子	丑	寅	卯|	辰	巳

    辰	巳	午	未	申	酉	戌	亥	子	丑|	寅	卯

    寅	卯	辰	巳	午	未	申	酉	戌	亥|	子	丑

*/


GANZHI::GANZHI() : _buf{0}
{

}

GANZHI::GANZHI(GAN10 g, ZHI12 z) : _g(g), _z(z)
{

}

GANZHI GANZHI::chong() const
{
    return GANZHI(_g.chong(), _z.chong());
}

GAN10 GANZHI::wujia() const
{
    return _g == GAN_T::JIAA ? dun() : _g;
}

GAN10 GANZHI::dun() const
{
    return GAN_T::WUUU + xun();
}

int GANZHI::xun() const
{
    ZHI12 xs = shouzhi();
    return (12 - xs.id()) % 12 / 2;
}

int GANZHI::wei() const
{
    return _g.id() - GAN_T::JIAA;
}

ZHI12 GANZHI::shouzhi() const
{
    return _z - wei();
}

GANZHI GANZHI::xunshou() const
{
    return GANZHI(GAN_T::JIAA, _z - wei());
}

const char *GANZHI::name() const
{
    snprintf(_buf, sizeof(_buf), "%s%s", _g.name(), _z.name());
    return _buf;
}

int GANZHI::gz60() const
{
    return xun() * 10 + wei();
}

GANZHI GANZHI::gz60(int gz60)
{
    gz60 = XUNHUAN ( gz60, 60 ) ;
    return  GANZHI ( GAN10(gz60 % 10), ZHI12(gz60 % 12));
}

GANZHI GANZHI::chujia(const GAN10& g)
{
    int diff;
    diff = g.id() - GAN_T::WUUU;
    if(diff < 0) return {GAN10(), ZHI12()};

    return {GAN_T::JIAA, (diff * 10) % 12 };
}

ZHI12X2 GANZHI::kw() const
{
    return ZHI12X2(kw1().id(), kw2().id());
}

WUXINGX2 GANZHI::wx5() const
{
    return WUXINGX2(_g.wx5(),_z.wx5());
}

WUXINGX2 GANZHI::he() const
{
    return WUXINGX2(_g.he5(),_z.he6());
}

ZHI12 GANZHI::kw1() const
{
    return _z + (GAN_T::GUII - _g.id() + 1);
}

ZHI12 GANZHI::kw2() const
{
    return _z + (GAN_T::GUII - _g.id() + 2);
}


BAZI::BAZI()
{
    _name[0] = 0;
}

BAZI::BAZI(const GANZHI& n, const GANZHI& y, const GANZHI& r, const GANZHI& s):
    _n(n), _y(y), _r(r), _s(s)
{
    _name[0] = 0;
}

const BAZI BAZI::nl(int year360, int month360, int day360, int hour360)
{
    return BAZI(GANZHI::gz60(year360),
                GANZHI::gz60(month360),
                GANZHI::gz60(day360),
                GANZHI::gz60(hour360));
}

const char *BAZI::name() const
{
    snprintf(_name, sizeof(_name),
             "%s%s %s%s %s%s %s%s",
             _n._g.name(), _n._z.name(),
             _y._g.name(), _y._z.name(),
             _r._g.name(), _r._z.name(),
             _s._g.name(), _s._z.name());
    return _name;
}

